#pragma once

#include "CuboGrua.h"
#include "ShaderLoader.h"

#include <GL/glew.h>
#include <glm/glm.hpp> 
#include <glm/gtc/matrix_transform.hpp>

class Grua{
private:
	glm::mat4 matriz_modelo;

	const int m_altura_grua;
	const int m_posx_inicial_grua;
	const int m_posy_inicial_grua;
	const int m_angulo_rot;
	const int m_desp_grua;

	GLfloat rotate;
	GLfloat xg;
	GLfloat yg;

    glm::mat4 view_matrix;
	glm::mat4 projection_matrix;
    glm::vec4 light_position;
    glm::vec3 light_intensity;

	CuboGrua m_cubo;
	ShaderLoader m_shaderCuboGrua;

	void Grua::renderGrua(const glm::mat4 &model_matrix);
	void Grua::renderFragmentoColumna(const glm::mat4 &model_matrix, bool ultimo);
	void Grua::renderBarraLateralGrua(const glm::mat4 &model_matrix);
	void Grua::renderBarraVerticalGrua(const glm::mat4 &model_matrix);
	void Grua::renderBarraDiagonalGrua(const glm::mat4 &model_matrix);
	void Grua::renderCabinaGrua(const glm::mat4 &model_matrix);
	void Grua::renderColumnaGrua(const glm::mat4 &model_matrix, int altura);
	void Grua::renderBrazoGrua(const glm::mat4 &model_matrix, int largo);

public:
	Grua();
	virtual ~Grua(void);
	void init(void);

	int getAlturaGrua();
	int getDespGrua();
	int getAngRotacion();
	GLfloat getRotate();
	GLfloat getXG();
	GLfloat getYG();

	void setRotate(GLfloat r);
	void setXG(GLfloat x);
	void setYG(GLfloat y);


	void dibujar(const glm::mat4 &viewMatrix, const glm::mat4 &projectionMatrix, const glm::vec4 &light_position, const glm::vec3 &light_intensity, const glm::mat4 &model);

};

